package com.hlm.demo.controller.adminlogin;


import com.hlm.demo.common.ResultWrapper;
import com.hlm.demo.entity.ModuleInfo;

import com.hlm.demo.entity.ex.AdminWithRole;
import com.hlm.demo.service.adminlogin.IAdminLoginService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @author Ric
 * 登录权限相关 controller
 * 功能:
 *      1. 获取前端输入登录账号密码进行校验
 *      2. 账号密码校验通过后, 查出此账号的权限 (@AdminLoginService)
 *          <1> 若为超级管理员, 则进入上帝模式, 查出权限表所有权限数据 [allModuleInfoSearcher()]
 *          <2> 若为普通管理员, 则进入普通模式, 查出权限表所有权限数据 [moduleInfoSearcher(String username)]
 *          <3> 若非管理员账号, 返回错误页面, 5秒后跳转至 login 页面
 */
@Controller
@RequestMapping("/user")
public class LoginController {

    @Autowired
    private IAdminLoginService adminService;


    @RequestMapping("/login")
    public String login(@RequestParam("adminCode") String username, String password, HttpServletRequest request) {

        System.out.println(username); // TODO 关闭
        System.out.println(password); // TODO 关闭

        // 获取 session
        HttpSession session = request.getSession();
        session.removeAttribute("permission");


        // 超管查询
        if (username.equals("SuperAdmin") && password.equals("SuperAdmin")) {
            List<ModuleInfo> moduleInfo = adminService.allModuleInfoSearcher();


            // 给予上帝模式
            session.setAttribute("permission", "God");
            session.setAttribute("moduleInfo", moduleInfo);
            session.setAttribute("adminInfo", "SuperAdmin");
            return "redirect:/index.html";
        }

        // 普管查询
        // 根据登录账户获取数据库中此账户的信息
        AdminWithRole adminWithRole = adminService.adminInfoSearcher(username);

        // 判定密码是否正确
        if (adminWithRole != null && adminWithRole.getPassword().equals(password)) {

            // 将此账户信息存入 session TODO 在最后的两个模块中提取出
            session.setAttribute("adminInfo", username);

            // 获取普管权限列表
            List<ModuleInfo> moduleInfo = adminService.moduleInfoSearcher(username);


            // 给予相应权限
            session.setAttribute("permission", "Admin");
            session.setAttribute("moduleInfo", moduleInfo);
            return "redirect:/index.html";
        }

        // 若非管理员, 返回错误页面
        return "redirect:/error.html";

    }

    /**
     * 转为 Json 数据
     *      方法[godModuleInfo()] -- 将 Json 数据包装, 并赋予键值对 permission : God
     *      方法[adminModuleInfo()] -- 将 Json 数据包装, 并赋予键值对 permission : Admin
     *      方法[error()] -- 将 Json 数据包装, 返回错误代码 250, 赋予 message : error <- 貌似没啥用, 未登录时地址栏 /user/loginInfo 会被拦截
     */
    @ResponseBody
    @RequestMapping("/loginInfo")
    public Object loginInfo(HttpServletRequest request) {

        HttpSession session = request.getSession();
        String permission = (String) session.getAttribute("permission");

        // 包装 Json 数据返回至前端
        switch (permission) {
            case "God":
                return ResultWrapper.godModuleInfo(session.getAttribute("moduleInfo"));
            case "Admin":
                return ResultWrapper.adminModuleInfo(session.getAttribute("moduleInfo"));
            default:
                return ResultWrapper.error(250, "Error");
        }

    }


}
